package com.yanfan.njLighting.utils;

public class TenToSixteenUtils {

    // 公共的 Modbus 命令字节数组  关
    private static final byte[] COMMAND_TEMPLATE = new byte[]{
            0x12, 0x54, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06,
            (byte) 0x9C, (byte) 0x40, 0x00, 0x00
    };

    //开
    private static final byte[] COMMAND_TEMPLATE_OPEN = new byte[]{
            0x12, 0x54, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06,
            (byte) 0x9C, (byte) 0x40, 0x00, 0x01
    };

    // 十进制地址
    private static final int DECIMAL_ADDRESS = 40000;

    // 高字节和低字节在数组中的位置
    private static final int POSITION_HIGH = 8; // 高字节位置
    private static final int POSITION_LOW = 9;  // 低字节位置

    /**
     * 将十进制寄存器地址转换为对应的高低字节形式的字节数组
     *
     * @param address 十进制寄存器地址
     * @return 高低字节形式的字节数组
     */
    public static byte[] decimalToHexBytes(int address) {
        int highByte = (address >> 8) & 0xFF;  // 取高字节
        int lowByte = address & 0xFF;           // 取低字节
        return new byte[]{(byte) highByte, (byte) lowByte};
    }

    /**
     * 替换命令中的特定地址  关
     *
     * @param decimalAddress 需要转换的十进制地址
     * @return 替换后的字节数组
     */
    public static byte[] replaceAddressInCommand(int decimalAddress) {
        byte[] command = COMMAND_TEMPLATE.clone();
        byte[] addressBytes = decimalToHexBytes(decimalAddress);
        // 替换高字节和低字节
        command[POSITION_HIGH] = addressBytes[0]; // 替换高字节
        command[POSITION_LOW] = addressBytes[1];  // 替换低字节

        return command;
    }

    /**
     * 开
     * @param decimalAddress
     * @return
     */
    public static byte[] openStatus(int decimalAddress) {
        byte[] command = COMMAND_TEMPLATE_OPEN.clone();
        byte[] addressBytes = decimalToHexBytes(decimalAddress);

        // 替换高字节和低字节
        command[POSITION_HIGH] = addressBytes[0]; // 替换高字节
        command[POSITION_LOW] = addressBytes[1];  // 替换低字节

        return command;
    }

    public static void main(String[] args) {
        // 创建命令副本以进行地址替换
        byte[] command = COMMAND_TEMPLATE.clone();

        // 替换命令中的地址
        byte[] updatedCommand = replaceAddressInCommand(DECIMAL_ADDRESS);

        // 打印替换后的命令（十六进制格式）
        System.out.println("替换后的命令：");
        for (byte b : updatedCommand) {
            System.out.printf("0x%02X ", b);
        }
    }
}
